home *** CD-ROM | disk | FTP | other *** search
Text File | 1986-10-25 | 3.8 KB | 141 lines | [TEXT/EDIT] |
- {_______________________________________________________________________
- PAINTFILEMGR
-
- DESCRIPTION
- Procedures for opening and displaying Paint files with
- high level routines from Toolbox file manager. This might
- not work in a 128K Mac, but could probably be made to work
- by reading and unpacking the file in smaller chunks.
-
- AUTHOR
- Gary B. Palmer. Public domain. October 25, 1986.
- Author reserves right to use in own programs.
- _______________________________________________________________________}
-
-
- procedure SFGetPaint(var theReply:SFReply);
- const
- SFPutLeft = 100;
- SFPutTop = 100;
- var
- SFPutPt:Point;
- PNTG_list:SFTypeList;
- begin
- PNTG_list[0] := 'PNTG';
- SetPt(SFPutPt, SFPutLeft, SFPutTop);
- SFGetFile(SFPutPt, '', Nil, 1, PNTG_list, Nil, theReply);
- end;{SFGetPaint}
-
-
- procedure CloseOldFile(refNum:Integer; vRefNum:Integer);
- var
- err:OSErr;
- begin
- err := FSClose(refNum);
- err := FlushVol(nil, vRefNum);
- end;{CloseOldFile}
-
-
- procedure ReadPaintFile(refNum:Integer; var PackedBitsPtr:Ptr);
- var
- bytes:LongInt;
- err:OSErr;
- begin
- PackedBitsPtr := Nil;
- err := GetEOF(refNum, bytes); {FIND LOGICAL END OF FILE}
- bytes := bytes - 512; {HEADER BLOCK NOT NEEDED}
- if odd(bytes) then Exit(ReadPaintFile);
- PackedBitsPtr := NewPtr(bytes); {MAKE A HOME FOR THE DATA}
- if MemError <> noErr then begin
- Exit(ReadPaintFile);
- PackedBitsPtr := Nil;
- end;
- err := SetFPos(refNum, FSFromStart, 512); {START AT BEGINNING OF DATA}
- err := FSRead(refNum, bytes, PackedBitsPtr); {READ THE DATA TO THE BUFFER}
- end;{ReadPaintFile}
-
-
- procedure GetPaintImage(var ImagePtr:Ptr);
- const
- SizeOfPaintImage = 51840;
- var
- refNum:Integer;
- theReply:SFReply;
- err:OSErr;
- packedBitsPtr:Ptr;
- destPtr, SrcPtr:Ptr;
- saveStart:longInt;
- bytesUnPacked:Integer;
-
- begin
-
- ImagePtr := Nil;
-
- SFGetPaint(theReply);
-
- with theReply do
-
- if not good then Exit(GetPaintImage)
- else begin
-
- err := FSOpen(fName, vRefNum, refNum);
-
- if err <> 0 then Exit(GetPaintImage);
-
- ReadPaintFile(refNum, packedBitsPtr);
- {RETURNS A POINTER TO THE PACKED DATA. SEE ABOVE}
-
- CloseOldFile(refNum, vRefNum); {CLOSE FILE IMMEDIATELY}
-
- if packedBitsPtr = Nil then Exit(GetPaintImage);
-
- ImagePtr := NewPtr(SizeOfPaintImage); {MAKE A HOME FOR THE IMAGE}
-
- if MemError <> 0 then Exit(GetPaintImage);
-
- {POINTERS TO BE USED BY UNPACKBITS WILL BE INCREMENTED, SO SAVE
- OLD POINTERS BY CREATING A COUPLE OF SCAPEGOATS:SRCPTR AND DESTPTR}
- SrcPtr := packedBitsPtr; {SRCPTR WILL BE INCREMENTED}
- DestPtr := ImagePtr; {DESTPTR WILL BE INCREMENTED}
-
- {A PAINT IMAGE HAS MORE BYTES THAN CAN BE REPRESENTED BY AN
- INTEGER, AND UNPACKBITS ACCEPTS ONLY INTEGERS, SO UNPACK
- ONLY HALF THE BYTES AT A TIME.}
-
- saveStart := ord(DestPtr);
- UnpackBits(SrcPtr, DestPtr, SizeOfPaintImage div 2);
- bytesUnPacked := ord(DestPtr) - saveStart;
-
- {THE FINAL UNPACKING STARTS FROM THE NEW VALUES OF SRCPTR.}
- UnpackBits(SrcPtr, DestPtr, SizeOfPaintImage - bytesUnPacked);
-
- DisposPtr(packedBitsPtr);
-
- end;
- end;{GetPaintImage}
-
-
- procedure DisplayPaintFile(ImagePtr:Ptr);
- var
- pageBits:BitMap;
- drawRect:Rect;
- begin
-
- if ImagePtr = Nil then Exit(DisplayPaintFile);
-
- {SET UP AN APPROPRIATE BITMAP TO SEND TO COPYBITS}
- with pageBits do begin
- baseAddr := ImagePtr; {GIVE THE BUFFER TO THE BITMAP}
- rowBytes := 72; {ROWBYTES OF PAINT IMAGE}
- SetRect(bounds, 0, 0, 576, 720); {ENCLOSES PAINT IMAGE}
- end;
-
- {ASSUMES THE MAIN PROGRAM HAS OPENED A WINDOW APPROX
- THE SAME SIZE AS THE SCREEN AND SET THE PORT}
- SetRect(drawRect, 148, 0, 364, 270); {3/8 NORMAL SIZE, CENTERED}
- copyBits(pageBits, thePort^.portbits, pagebits.bounds, drawRect,
- srcCopy, Nil);
-
- end;{DisplayPaintFile}
-
- {_______________________________________________________________________}